home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / make / icmake-6.000 / icmake-6 / icmake / comp / callrss.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-08  |  2.7 KB  |  89 lines

  1. /*
  2.                                 C A L L R S S . C
  3. */
  4.  
  5. #include "iccomp.h"
  6.  
  7. void callrss(ESTRUC_ *e, FUNNR_ funnr, ...)
  8. {
  9.     register E_TYPE_
  10.         type = e_reg | e_int;               /* default return type: intreg */
  11.     register unsigned
  12.         args = 1;                           /* most f()s having 1 argument */
  13.     va_list
  14.         marker;
  15.  
  16.     va_start(marker, funnr);
  17.  
  18.     gencode (e, op_call_rss, funnr);        /* call the function */
  19.  
  20.     switch (funnr)
  21.     {
  22.                                             /* 0 args, returning string */
  23.         case f_getch:
  24.         case f_gets:
  25.             args--;
  26.             type = e_str | e_reg;
  27.         break;
  28.                                             /* 0 args, returning int */
  29.         case f_getpid:
  30.             args--;
  31.             type = e_int | e_reg;
  32.         break;
  33.                                             /* 1 arg, returning string */
  34.         case f_ascii_str:
  35.         case f_g_base:
  36.         case f_g_ext:
  37.         case f_g_path:
  38.             type = e_str | e_reg;
  39.         break;
  40.                                             /* 2 arguments, returning int */
  41.         case f_system:
  42.             args++;
  43.         break;
  44.                                             /* 2 args, returning string */
  45.         case f_chdir:
  46.         case f_c_base:
  47.         case f_c_ext:
  48.         case f_c_path:
  49.         case f_str_el:
  50.         case f_element:
  51.             args++;                         /* two arguments */
  52.             type = e_str | e_reg;           /* returning string */
  53.         break;
  54.  
  55.                                             /* 2 args, returning list */
  56.         case f_stat:
  57.         case f_fgets:                       /* list fgets(string, int) */
  58.         case f_fields:                      /* list fields(string, string) */
  59.         case f_makelist:                    /* list makelist(int, string)  */
  60.             args++;
  61.             type = e_list | e_reg;
  62.         break;
  63.                                             /* # args passed as argument */
  64.         case f_execute:
  65.         case f_exec:
  66.         case f_fprintf:
  67.         case f_printf:
  68.             args = va_arg(marker, unsigned);
  69.         break;
  70.  
  71.         /*
  72.             default: functions having one arg returning an int
  73.  
  74.             case f_ascii_int:
  75.             case f_putenv:
  76.             case f_arg_head:
  77.             case f_arg_tail:
  78.             case f_cmd_head:
  79.             case f_cmd_tail:
  80.             case f_echo:
  81.             case f_exists:
  82.             case f_sizeoflist:
  83.         */
  84.     }
  85.     if (args)
  86.         gencode (e, op_asp, args);          /* add stack pointer */
  87.     set_type(e, type);                      /* type of resulting expression */
  88. }
  89.